iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 10
2

建立完 Migration 之後,接下來要設定原來在專案就存在的 User Model ( 在 app 資料夾裡 )

Model

同樣的 Model 也先來簡介一下。雖然前面的 MVC 架構中也有提到 Model 這個詞,但是對 Laravel 而言,提到 Model 的同時,就會聯想到 Eloquent,Eloquent 為 Laravel 的 ORM (Object Relational Mapping),ORM 能夠讓我們更簡便地操縱資料庫,因為 ORM 幫我們把 SQL 的語法包裝起來,使其更貼近人類的語言,而每個 database schema 對應到一個 Model,透過 Model 來對相對應的 database table 採取許多動作,舉凡增刪改查,以及其他進階的指令。

以下為常見的 ORM 範例:

  • 取得所有的使用者資料:
// SELECT * FROM users;

User::all();
  • 取得某位使用者資料:
// SELECT * FROM users WHERE id = 1;

User::find(1);
  • 新增某位使用者
// INSERT INTO users (name, account, password) VALUES ('Ken', 'kenchen0625', 'blablabla');

$user = new App\User;
$user->name = "Ken";
$user->account = "kenchen0625";
$user->password = "blablabla";
$user->save();
  • 更新某位使用者資料
// UPDATE users SET name='KenChen' where id=1;

$user = App\User::find(1);
$user->name = "KenChen";
$user->save();
  • 刪除某位使用者
// DELETE FROM users WHERE id=1;

User::where('id', 1)->delete();

Mass assignment

到此為止,其實各位可能有察覺到一件事,就是某些 ORM 的語法還是稍嫌不夠簡潔,上述會舉新增更新的例子正是因為如此,那有何更簡潔的方式呢?正好藉由定義 Mass assignment 使 ORM 能夠透過 create() 或 update() 取代 save(),其中 create 和 update 中的參數可以一次性將欲寫入的 key 和 value 寫進去,如此可以省掉好幾行程式碼。當然要應用 create() 或 update() 之間必須要先設定 mass assignment,因為有可能一些不肖的使用者會在 input 中植入一些預料之外的指令 ( 甚至是 SQL 的指令 )來篡改資料庫,若要將這些預料之外的 input 過濾掉,以下例子說明。

*User.php

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

其中的 fillable 為 mass assignable 的值,當使用者輸入這些 attribute 之外的參數(而那些參數也屬於該 database table 的某個 column ),就會產生錯誤。以下就來改寫成這次專案的設定。

*User.php

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password', 'is_admin', 'api_token'
    ];

除此之外,還有一個屬性為 guarded,而這個屬性正好是與 fillable 相反,為 mass unassignable 的值,當使用者想要輸入該參數的值,就會被擋掉。以下例子為允許任何 input 參數,但不建議這麼做。

*User.php

     /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $guarded = [];

Hidden attributes

若想查看該資料所有的屬性,但有些屬性的值不想要呈現出來 ( 如:在 JSON 格式或 array 中的某些 key 和 value ),則必須設定 hidden attributes。

/**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token', 'api_token'
    ];

下一篇文章來介紹 router,敬待分解。

參考資料:

  1. Eloquent:https://laravel.com/docs/6.x/eloquent
  2. Eloquent hidden attributes:https://laravel.com/docs/6.x/eloquent-serialization#hiding-attributes-from-json

上一篇
Day 09 : user ( Migration )
下一篇
Day 11 : user ( api routes )
系列文
從零開始的Laravel RESTful api30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言